home *** CD-ROM | disk | FTP | other *** search
- ⓪ MODULE MM2Serialize;⓪ ⓪ (* =======================================⓪'Vertraulich! Keinesfalls weitergeben!⓪&=======================================⓪ ⓪&Seriennummern im Compiler eintragen⓪(⓪&17.11.87 jm /0.0/ Suchen der Seriennummern⓪&15.12.87 jm /1.0/ lauffähige Version⓪&29.02.88 jm /1.1/ neues Schlüsselverfahren mit Offset⓪&??.??.89 TT /1.2/ wählt beliebig viele Dateien mit Selektor aus⓪&08.03.90 TT /1.3/ ForceMediaChange-Aufruf⓪=>>> Bringt aber nichts bei Cache-Prg, weil⓪Adas offenbar nichts davon mitbekommt⓪ *)⓪ ⓪ IMPORT GEMDOSIO; (*$E MOS*)⓪ ⓪ FROM SYSTEM IMPORT ASSEMBLER;⓪ ⓪ FROM Files IMPORT File, Open, Create, Close, Remove, State,⓪4Access, ReplaceMode;⓪ FROM MOSGlobals IMPORT Drive;⓪ FROM FileNames IMPORT StrToDrive;⓪ FROM Directory IMPORT ForceMediaChange;⓪ FROM Binary IMPORT SeekMode, Seek, ReadBytes, ReadWord, WriteWord, FileSize;⓪ FROM PathCtrl IMPORT PathList;⓪ FROM ShellMsg IMPORT StdPaths;⓪ FROM Paths IMPORT SearchFile, ListPos;⓪ FROM InOut IMPORT WriteString, WriteLn, Read, WriteCard, ReadCard, WriteHex,⓪4WritePg;⓪ FROM Storage IMPORT ALLOCATE, DEALLOCATE;⓪ FROM Strings IMPORT Concat;⓪ FROM StrConv IMPORT CardToStr;⓪ FROM SYSTEM IMPORT ADDRESS;⓪ FROM PrgCtrl IMPORT TermProcess;⓪ ⓪ FROM GEMEnv IMPORT RC, DeviceHandle, InitGem;⓪ FROM EasyGEM0 IMPORT HideMouse;⓪ FROM EasyGEM1 IMPORT SelectMask, SelectFile;⓪ ⓪ ⓪ ⓪ CONST NrKeys = 2; (* Anzahl verschiedener Schlüssel *)⓪*NrMods = 2; (* Anzahl der Module mit Schlüsseln *)⓪(maxCount = 10; (* max. Anzahl Referenzen pro Nummer *)⓪ ⓪ TYPE PosList = ARRAY [1..maxCount] OF LONGCARD;⓪ ⓪ VAR⓪,value, (* Werte der Default-Seriennummern *)⓪-lead, (* LeadIn-Worte -"- *)⓪)expCount, (* erwartete Anzahl der Vorkommen *)⓪,patch: ARRAY [0..NrKeys] OF CARDINAL;⓪*offsets: ARRAY [1..NrMods] OF ARRAY [0..NrKeys] OF PosList;⓪ ⓪-Offs,⓪+RegLen,⓪)FeedBack,⓪*Iterate: ARRAY [1..NrKeys] OF CARDINAL;⓪ ⓪)compname: ARRAY [1..NrMods] OF ARRAY [0..141] OF CHAR;⓪/ok: BOOLEAN;⓪ ⓪ ⓪ PROCEDURE err (s: ARRAY OF CHAR; fatal: BOOLEAN);⓪"VAR c: CHAR;⓪"BEGIN⓪$WriteLn; WriteString ('>> '); WriteString (s); WriteLn;⓪$IF fatal THEN⓪&Read (c); TermProcess (1);⓪$END⓪"END err;⓪"⓪ ⓪ PROCEDURE ReadCompiler (VAR a: ADDRESS; VAR size: LONGCARD;⓪9name: ARRAY OF CHAR): BOOLEAN;⓪"⓪"(* Sucht Datei <name> auf DefaultPath,⓪%reserviert Speicher und liest Datei ein.⓪%<a> := Anfangsadresse der Datei im Speicher;⓪%<size> := Länge -"- .⓪%Ergebnis := 'Datei gefunden, genug Platz zum Einlesen gehabt'⓪"*)⓪"⓪"VAR f: File;⓪+read: LONGCARD;⓪ ⓪"BEGIN⓪$Open (f, name, readOnly);⓪$size := FileSize (f);⓪$ALLOCATE (a, size);⓪$IF a = NIL THEN RETURN FALSE END;⓪$ReadBytes (f, a, size, read);⓪$IF size # read THEN RETURN FALSE END;⓪$Close (f);⓪$RETURN TRUE⓪"END ReadCompiler;⓪ ⓪ ⓪ PROCEDURE Search ( a: ADDRESS; len: LONGCARD; targ1, targ2: CARDINAL;⓪2VAR count: CARDINAL;⓪4VAR pos: PosList);⓪"BEGIN⓪$ASSEMBLER⓪&MOVE.L pos(A6),A1⓪&CLR.W D3⓪&MOVE.L a(A6),A0⓪&MOVE.L len(A6),D1⓪&MOVE.W targ1(A6),D0⓪&MOVE.W targ2(A6),D4⓪#⓪#lp CMP.W (A0)+,D0 ;Suchschleife⓪&BNE nix⓪&CMP.W (A0),D4⓪&BNE nix⓪&MOVE.L A0,D2⓪&SUB.L a(A6),D2⓪&MOVE.L D2,(A1)+⓪&ADDQ.L #1,D3⓪"nix SUBQ.L #2,D1⓪&BHI lp⓪&⓪&MOVE.L count(A6),A0⓪&MOVE.W D3,(A0) ;setze Count⓪$END⓪"END Search;⓪ ⓪ ⓪ PROCEDURE FindOffsets;⓪"⓪"(* Liest alle Dateien <compname>.⓪&Durchsucht sie nach Auftreten von <lead>, <value> und prüft⓪&jeweils, ob <expcount> Vorkommen gefunden. Wenn gefunden, wird⓪&der jew. Offset im entspr. File in 'offsets' vermerkt.⓪&Bricht im Fehlerfall mit Meldung ab.⓪"*)⓪&⓪"VAR a: ARRAY [1..NrMods] OF ADDRESS;⓪/l: ARRAY [1..NrMods] OF LONGCARD;⓪.wl: LONGCARD;⓪-ofs: PosList;⓪"count, n, i, k: CARDINAL;⓪*errmsg: ARRAY [0..127] OF CHAR;⓪+dummy: BOOLEAN;⓪"⓪"BEGIN⓪$wl:= 0;⓪$FOR n:= 1 TO NrMods DO⓪&IF NOT ReadCompiler (a [n], l [n], compname [n]) THEN⓪(err ('Compiler kann nicht gelesen werden!', TRUE)⓪&END;⓪&INC (wl, l [n]);⓪&FOR k:= 0 TO NrKeys DO⓪(FOR i:= 1 TO expCount [k] DO offsets [n, k, i]:= 0 END⓪&END;⓪$END;⓪$FOR k:= 0 TO NrKeys DO⓪&Search (a [1], wl, lead [k], value [k], count, ofs);⓪&IF count # expCount [k] THEN⓪(Concat ('Falsche Anzahl Schlüsseleinträge: ',⓪1CardToStr (count, 0), errmsg, dummy);⓪(err (errmsg, TRUE)⓪&END;⓪&FOR i:= 1 TO expCount [k] DO⓪(FOR n:= 1 TO NrMods DO⓪*IF (ofs[i] >= a[n] - a[1]) & (ofs[i] < a[n] - a[1] + l[n]) THEN⓪,offsets [n, k, i]:= ofs[i] - (a[n] - a[1])⓪*END⓪(END⓪&END⓪$END;⓪$count:= 0;⓪$FOR n:= 1 TO NrMods DO⓪&FOR k:= 0 TO NrKeys DO⓪(FOR i:= 1 TO expCount [k] DO⓪*IF offsets [n, k, i] = 0L THEN INC (count) END;⓪(END⓪&END;⓪&DEALLOCATE (a [n], l [n]);⓪$END;⓪$n:= 0;⓪$FOR k:= 0 TO NrKeys DO⓪&INC (n, expCount [k])⓪$END;⓪$IF count # n THEN⓪&err ('Interner Fehler: Schlüsselanzahl falsch.', TRUE)⓪$END⓪"END FindOffsets;⓪"⓪"⓪ PROCEDURE encode (start, len, feedback, iter, off: CARDINAL): CARDINAL; (*$L-*)⓪$⓪"(* Schieberegister rechtsrum, Bits 0..<len>,⓪%Rückkopplung aus Bit <feedback>, auf <start>-Wert loslassen.⓪%<iter> Iterationen durchführen; <Off> addieren;⓪%Ergebnis auf Cardinal kürzen⓪"*)⓪"⓪"BEGIN⓪$ASSEMBLER⓪&MOVE.W -(A3),D3 ;Offset⓪&MOVE.W -(A3),D2 ;Iterationen⓪&MOVE.W -(A3),D0 ;rückgeführtes Bit⓪&MOVE.W -(A3),D4 ;Registerlänge -1⓪&CLR.L D1⓪&MOVE.W -(A3),D1 ;Startwert⓪&BRA l1⓪#l2 BTST D0,D1 ;Bit0 := Bit0 EOR Bit(D0)⓪&BEQ nochg ; "⓪&BCHG #0,D1 ; "⓪ nochg LSR.L #1,D1 ;einmal rechts schieben⓪&BCC l1 ;und Bit0 in Bit(D4) rotieren⓪&BSET D4,D1⓪#l1 DBF D2,l2⓪&ADD.W D3,D1 ;Offset dazu⓪&MOVE.W D1,(A3)+ ;Ergebnis zurück⓪$END⓪"END encode; (*$L+*)⓪"⓪"⓪ PROCEDURE CheckSer;⓪!⓪#(* prüft, ob die angegebenen Schlüsselverfahren konsistent⓪&sind mit den angegebenen Default-Einträgen.⓪&Im Fehlerfall Abbruch mit Meldung.⓪#*)⓪#⓪#VAR k: CARDINAL;⓪#⓪#BEGIN⓪%FOR k := 1 TO NrKeys DO⓪'IF encode (value[0], RegLen[k], FeedBack[k], Iterate[k], Offs[k])⓪*# value [k]⓪)THEN err ('Schlüsselverfahren paßt nicht zu Default-Einträgen', TRUE)⓪'END⓪%END⓪#END CheckSer;⓪#⓪ ⓪ PROCEDURE CalcSer (mySer: CARDINAL);⓪"⓪"(* Übergabe der Seriennummer in <mySer>.⓪%Setzt ARRAY <patch> auf verschlüsselte Seriennummern.⓪%Verwendet Beschreibung der Schlüsselverfahren in⓪%<RegLen>, <FeedBack>, <Iterate>. *)⓪"⓪"VAR k: CARDINAL;⓪"⓪"BEGIN⓪$patch [0] := mySer;⓪$WriteString (' Schlüssel'); WriteHex (patch [0], 7);⓪$FOR k := 1 TO NrKeys DO⓪&patch [k] :=⓪-encode (mySer, RegLen[k], FeedBack[k], Iterate[k], Offs [k]);⓪&WriteHex (patch[k], 7);⓪$END;⓪$WriteLn;⓪"END CalcSer;⓪"⓪"⓪ PROCEDURE OpenFile (VAR f: File; name: ARRAY OF CHAR): BOOLEAN;⓪"⓪"(* reserviert Speicher und liest Datei ein.⓪%<a> := Anfangsadresse der Datei im Speicher;⓪%<size> := Länge -"- .⓪%Ergebnis := 'Datei gefunden, genug Platz zum Einlesen gehabt'⓪"*)⓪ ⓪"BEGIN⓪$Open (f, name, readWrite);⓪$IF State (f) < 0 THEN⓪&err ('Datei nicht gefunden', FALSE); RETURN FALSE⓪$END;⓪$RETURN TRUE⓪"END OpenFile;⓪ ⓪ ⓪ PROCEDURE PatchSerial (mySer: CARDINAL): BOOLEAN;⓪"⓪"VAR j, k, n: CARDINAL;⓪*f: File;⓪*w: CARDINAL;⓪*⓪"BEGIN⓪$CalcSer (mySer);⓪$FOR n:= 1 TO NrMods DO⓪&IF NOT OpenFile (f, compname [n]) THEN⓪(RETURN FALSE⓪&END;⓪&FOR j:= 0 TO NrKeys DO⓪(FOR k:= 1 TO expCount [j] DO⓪*IF offsets [n, j, k] # 0L THEN⓪,Seek (f, offsets [n, j, k], fromBegin);⓪,ReadWord (f, w);⓪,IF w # value [j] THEN⓪.IF (j=0) & (k=1) THEN⓪0err ('Falsche Seriennummern gefunden: Datei unverändert', FALSE);⓪0Close (f);⓪.ELSE⓪0err ('Falsche Seriennummern gefunden: Datei gelöscht', FALSE);⓪0Remove (f);⓪.END;⓪.RETURN FALSE⓪,END;⓪,Seek (f, -2L, fromPos);⓪,WriteWord (f, patch [j])⓪*END⓪(END⓪&END;⓪&Close (f);⓪$END;⓪$RETURN TRUE⓪"END PatchSerial;⓪"⓪"⓪ VAR n, mySer: CARDINAL;⓪-c: CHAR;⓪,dh: DeviceHandle;⓪ ⓪ BEGIN⓪"⓪"InitGem (RC, dh, ok);⓪"⓪"HideMouse;⓪"WritePg;⓪"⓪"(* Konstanten für Schlüssel *)⓪"⓪"RegLen [1] := 17; FeedBack [1] := 7; Iterate [1] := 39; Offs [1] := $2302;⓪"RegLen [2] := 16; FeedBack [2] := 3; Iterate [2] := 367; Offs [2] := $3C78;⓪#⓪"(* Default-Seriennummern im Compiler *)⓪"⓪"value [0] := $4711; expCount [0] := 3; lead [0] := $0641;⓪"value [1] := $1ADE; expCount [1] := 1; lead [1] := $343C;⓪"value [2] := $312F; expCount [2] := 1; lead [2] := $0240;⓪"⓪"(* Seriennummern im Compiler suchen *)⓪"⓪"WriteString ('Serialize /1.3/: Seriennummern in Compiler eintragen ');⓪"WriteLn; WriteLn;⓪"⓪"(*⓪"WriteString ('Achtung: Bei TOS 1.4ff kein Cache-Prg verwenden!');⓪"WriteLn; WriteLn;⓪"*)⓪"⓪"WriteString ('Konsistenzprüfung der angegebenen Schlüssel:'); WriteLn;⓪"CheckSer;⓪"WriteString (' ok.'); WriteLn; WriteLn;⓪"⓪"FOR n:= 1 TO NrMods DO⓪$SelectFile ('Wo isser?', compname [n], ok);⓪$IF NOT ok THEN RETURN END;⓪$WritePg;⓪"END;⓪"⓪"WriteString ('Suchen der Seriennummern:'); WriteLn;⓪"⓪"FindOffsets;⓪"WriteString (' ok.'); WriteLn; WriteLn;⓪"⓪"(* neue Seriennummern eintragen *)⓪"⓪"LOOP⓪$WriteString ('Neue Seriennummer eintragen:'); WriteLn;⓪$WriteString (' Nummer eingeben (0 stoppt): ');⓪$ReadCard (mySer);⓪$IF mySer = 0 THEN EXIT END;⓪$⓪$ForceMediaChange (StrToDrive (compname[1]));⓪$IF PatchSerial (mySer) THEN⓪&WriteString (' ok.'); WriteLn;⓪$END;⓪$WriteLn;⓪"END;⓪"⓪ END MM2Serialize.⓪ ə
- (* $FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$000022E2$FFEDDD92$000025CB$FFEDDD92$00000C2C$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92$FFEDDD92ü$000022E2T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$00000275$00000268$00000272$0000024F$0000023D$00002285$000022E2$00000396$FFD6B137$FFD6B137$000003AA$000003CF$000003B9$000003CB$000003E3$00000C2C£Çé*)
-